<?php

namespace App\Console\Commands;

use App\Models\News;
use App\Models\NewsDesc;
use App\Models\SiteRss;
use App\Service\Email;
use Illuminate\Console\Command;

class SendEmailCommand extends Command
{
    /**
     * 请求：
     *  sudo -u www php artisan command:send-email
     *  sudo -u www php /www/wwwroot/option/artisan command:send-email
     *  sudo -u www php /www/wwwroot/newbusinesswire.com/laravel/artisan command:send-email
     *
     */
    /**
     * 参数与选项的区别
     *      在执行命令时，参数必须严格按定义时的顺序输入，不需输入参数名，只需输入参数的值即可。
     *      输入选项则必须带选项名，且选项名前须加 -- 前缀（选项简写字母前加 -），选项可按任意顺序输入
     */

    // 请求 以及参数
    // protected $signature = 'command:name {param1} {param2}';  // 必填参数
    // protected $signature = 'command:name {参数名?} {参数名=默认值} {参数名? : 参数说明}';  // 可选参数
    // protected $signature = 'command:name {--选项名} {--选项名=} {--选项名=默认值} {--简写字母|选项名} {--选项名 : 选项说明}';  // 选项
    protected $signature   = 'command:send-email';
    protected $description = '每天发送邮件';

    public function __construct()
    {
        parent::__construct();
    }

    // 执行
    public function handle()
    {
        $this->line('执行发送邮件！');

        // 获取时间：昨天的时间
        // 因为这几天没有数据，所以固定某一天的数据
        //$yesDay    = "2024-3-4";
        $start = time();
        $start = strtotime(date('Y-m-d', strtotime("-1 days")));   // 昨天
        $start = strtotime(date('Y-m-d')); // 今天
        $lists = $this->getArticle($start);
        /*if(empty($lists)){
            $start = $start - 86400;
            $lists = $this->getArticle($start);
        }*/
        if(empty($lists)){
            return $this->line('今天没有更新文章，不发送邮件！');
        }


        // 发送邮件参数
        $attach = 'D:/phpSite/slcm/option/public/favicon.ico'; // 附件
        $attach = ''; // 附件
        $data   = ['nList' => $lists, 'style_host' => env('STYLE_HOST'), 'date' => date('Y-m-d', $start)];
        $title  = 'atw商业电讯'.date('Y-m-d').'资讯';
        $title  = 'Asia Tech Wire：Today highlights  '.date('Y.m.d');

        // 获取邮件
        $mails = $this->getEmail();
        // 测试邮件
        //$mails = ['914432635@qq.com'];
        //$mails = ['23231590@qq.com'];
        //$mails = array_fill(0, 5, '23231590@qq.com');
        if(empty($mails)){
            return $this->error('没有订阅的邮件！');
        }

        // 执行发送邮件
        $_once   = 50;  // 每次发送邮件数
        $_sleep  = 120;  // 休息时间，单位秒
        $_total  = count($mails);
        $toEmail = new Email();
        foreach($mails as $_num => $_mail){
            $this->line('发送 '.($_num + 1).'/'.$_total.' 邮件：'.$_mail);

            // 邮件发送 避免报错
            try{
                $res = $toEmail->send($_mail, $title, $data, $attach);
            } catch(\Exception $e){
                $this->error($e->getMessage());
                $res = false;
            }
            if($res === false){
                $this->error($_mail.'发送邮件失败！');
            }


            // 每发送50封邮件，休息一分钟在继续
            if(($_num % $_once) == ($_once - 1)){
                $this->line('  ===>发送第 '.($_num + 1).'/'.$_total.' 封邮件，开启睡眠'.$_sleep.'秒');
                sleep($_sleep);
            }
        }

        return $this->line('发送邮件成功！');
    }

    // 获取今天的文章
    protected function getArticle($startTime)
    {
        // 前一天的
        $beginTime = $startTime - 86400;
        $endTime   = $startTime;
        // 当前一天的
        $beginTime = $startTime;
        $endTime   = $startTime + 86400;

        // 获取数据
        $where1 = [['ctime', '>=', $beginTime], ['ctime', '<=', $endTime], ['is_draft', '=', 0], ['verify', '=', 1], ['is_email', '=', 1], ['uid', '=', 0],];
        $where2 = [['ctime', '>=', $beginTime], ['ctime', '<=', $endTime], ['is_draft', '=', 0], ['verify', '=', 1], ['uid', '>', 0]];
        $lists1 = (new News())->getList($where1, 0);
        $lists2 = (new News())->getList($where2, 0);
        $lists  = array_merge($lists1, $lists2);

        $descs = (new NewsDesc())->getListInIds(array_column($lists, 'id'), '*', 'news_id');
        foreach($descs as $_key => $_desc){
            $number = 0;
            if(strpos($_desc['en_content'], '<img') !== false){
                $number = 1;
            }

            // 截取第一段
            $en_contents = explode('</p>', $_desc['en_content']);
            $cn_contents = explode('</p>', $_desc['cn_content']);
            $tc_contents = explode('</p>', $_desc['tc_content']);

            // 重新组合
            $descs[$_key]['en_content'] = ($en_contents[$number] ?? $en_contents[0]).'</p>';
            $descs[$_key]['cn_content'] = ($cn_contents[$number] ?? $cn_contents[0]).'</p>';
            $descs[$_key]['tc_content'] = ($tc_contents[$number] ?? $tc_contents[0]).'</p>';
        }

        $nList     = [];
        $domain    = env('STYLE_HOST');
        $oldDomain = env('OLD_HOST');
        foreach($lists as $_row){
            $date  = date('Y.m.d', $_row['ctime']);
            $_desc = $descs[$_row['id']] ?? [];
            // 整理
            $_row['date']           = $date;
            $_row['pic']            = str_replace($oldDomain, $domain, $_row['pic']);
            $_row['en_description'] = isset($_desc['en_content']) ? strip_tags($_desc['en_content']) : '';
            $_row['cn_description'] = isset($_desc['cn_content']) ? strip_tags($_desc['cn_content']) : '';
            // 整理
            $nList[$date][] = $_row;
        }

        // 按索引排序：升序
        // ksort($nList);

        return $nList;
    }


    // 发送邮件
    protected function getEmail()
    {
        $lists  = (new SiteRss())->where('status', 1)->orderBy('id', 'DESC')->get()->toArray();
        $emails = array_column($lists, 'email');
        /*if(empty($emails)){
            $emails = ['914432635@qq.com'];
        }*/

        //$emails[] = 'xhdx_2005@163.com';
        //$emails[] = '914432635@qq.com';
        //$emails[] = '23231590@qq.com';   // 同时给煜哥发送邮件
        //$emails[] = 'newsletter@nbwpress.com';   // 同时给煜哥发送邮件
        //$emails[] = '18113069917@163.com';   // 同时给煜哥发送邮件
        //$emails[] = 'svnewswire@gmail.com';   // 同时给煜哥发送邮件
        //$emails[] = 'tujj888@gmail.com';   // 同时给煜哥发送邮件

        return $emails;
    }


    // 参数与选项
    public function _handle()
    {
        // 参数
        echo $text = $this->argument('text');
        echo chr(10);
        $all = $this->argument();
        var_dump($all);
        echo chr(10);

        // 选项
        $option = $this->option('show');
        echo $option;
        echo chr(10);


        echo '测试';
        $this->info("md5('{测试}') = 测试");   // 输出

        return 0;
    }

}
